package org.gvp.manager.service;

import jakarta.servlet.http.HttpServletRequest;
import org.gvp.common.constant.BaseService;
import org.gvp.manager.dto.AuthorityTreeData;
import org.gvp.manager.dto.AuthorityTreeUpdate;
import org.gvp.manager.dto.MenuTreeData;
import org.gvp.manager.dto.NavigateMenuData;
import org.gvp.manager.pojo.SecurityUserMenu;
import org.gvp.manager.to.MapperUpdate;

import java.util.List;

/**
 * 用户菜单关系表 服务层接口
 */
public interface SecurityUserMenuService extends BaseService<SecurityUserMenu> {
    public static final String USER_MENU_KEY = "x-request-username";
    /**
     * 菜单顶层菜单的ID
     */
    public static final Integer PARENT_ID = 1030000000;

    /**
     * [用户菜单权限树] 获取用户菜单渲染权限树数据,将全部可用菜单信息装载为用户菜单树类型
     */
    List<MenuTreeData> findRenderTree();

    /**
     * [用户菜单权限树] 根据用户编号获取用户菜单渲染权限树
     * @param userId 用户编号
     */
    AuthorityTreeData findAuthorityTreeData(Integer userId);

    /**
     * [用户菜单权限树] 根据菜单的父菜单ID查找菜单树数据列表
     * <li> 查找菜单的子菜单集合 </li>
     * @param parentId 菜单的父菜单ID
     */
    List<MenuTreeData> findMenuTreeByParentId(Integer parentId);

    /**
     * [用户导航菜单] 查询用户导航菜单树
     */
    List<NavigateMenuData> findUserMenuTree(HttpServletRequest request);


    /**
     * [用户导航菜单] 根据用户编号查找用户分配的菜单信息,反回格式为导航菜单数据类型
     * @param userId 用户编号
     */
    List<NavigateMenuData> findNavigateMenuDataByUserId(Integer userId);

    /**
     * [用户导航菜单] 根据导航菜单ID查找导航菜单信息
     */
    NavigateMenuData findNavigateMenuById(Integer menuId);
    /**
     * 根据用户编号获取用户权限菜单key列表
     * @param userId 用户编号
     */
    List<String> findUserMenuKeys(Integer userId);
    /**
     * 更新用户菜单关系渲染权限树
     * @param update 权限更新对象
     */
    Integer editAuthority(AuthorityTreeUpdate update);


    /**
     * 根据用户id和菜单id查找用户菜单关系类对象
     * @param userId 用户id
     * @param menuId 菜单id
     * @return 用户菜单关系对象
     */
    SecurityUserMenu findByUserIdAndMenuId(Integer userId, Integer menuId);

    /**
     * 保存用户菜单关系权限信息
     * @param userId 用户id
     * @param menuKeys 菜单key列表
     */
    int saveUserAuthority(Integer userId,List<String> menuKeys);

    /**
     * 逻辑删除用户菜单关系,根据用户编号和用户菜单key列表
     * @param update 映射更新类对象
     */
    int logicalRemoveAuthority(MapperUpdate update);

}